package bndtools.services; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.osgi.service.url.AbstractURLStreamHandlerService; import org.osgi.util.tracker.ServiceTracker; public class WorkspaceURLStreamHandlerService extends AbstractURLStreamHandlerService { public static final String PROTOCOL = "workspace"; private final ServiceTracker<IWorkspace,IWorkspace> workspaceTracker; public WorkspaceURLStreamHandlerService(ServiceTracker<IWorkspace,IWorkspace> workspaceTracker) { this.workspaceTracker = workspaceTracker; } @Override public URLConnection openConnection(URL url) throws IOException { String protocol = url.getProtocol(); if (!PROTOCOL.equals(protocol)) throw new MalformedURLException("Unsupported protocol"); IPath path = new Path(url.getPath()); IWorkspace workspace = workspaceTracker.getService(); if (workspace == null) throw new IOException("Workspace is not available"); IPath workspaceLocation = workspace.getRoot().getLocation(); if (workspaceLocation == null) throw new IOException("Cannot determine workspace location."); IPath location = workspaceLocation.append(path); return new URL("file", null, location.toOSString()).openConnection(); } }